package control.ataque;

import interfasesGenerales.Atacable;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JOptionPane;

import batalla.Pelea;

import excepcionesUnidades.ExcepAtaqueInvalido;

import juego.Juego;
import jugadores.Jugador;

import unidades.Unidad;
import vista.VistaAtaque;

/**
 * @author Grupo 2, Algoritmos y programacion 3, Catedra Fontela<br>1er cuat 2007    
 * <br>Esta clase se encarga de controlar el boton atacar, de la vista ataque.
 */

public class BotonAtacarListener implements ActionListener {
	
	private VistaAtaque vista; //Referencia a la vista de ataque
	private Object[] atacantes; //Vector que contiene los atacantes
	private Atacable atacado; //Vector que contiene al atacado
	private Jugador jugadorActual; //Vector que contiene la referencia al jugador actual
	/**
	 * Inicializa el controlador
	 * @param vista VistaAtaque a controlar
	 */
	public BotonAtacarListener(VistaAtaque vista){
		this.vista = vista;
	}
	/**
	 * Define que realizar, cuando se acciona el boton
	 */
	public void actionPerformed(ActionEvent arg0) {
		String resultadoBatalla = "";
		//Obtengo los atacantes y el atacado de la seleccion en la vista
		try{
			atacantes = vista.getSeleccionadosLista1();
			atacado = (Atacable)vista.getPrimeroLista2();
			jugadorActual = Juego.getInstance().getRonda().getTurnoActual().getJugador();
		} catch (NullPointerException e){
			JOptionPane.showMessageDialog(vista, "La Batalla no pudo realizarse");
		}
		catch (ClassCastException e2){
			JOptionPane.showMessageDialog(vista, "La Batalla no pudo realizarse");
		}
		//Realizo todas las peleas entre atacantes y atacado
		for (int cont = 0; cont < atacantes.length; cont++){
			Unidad atacante = (Unidad)atacantes[cont];
			int indicePelea = cont + 1;
			if(!GenerarPelea(atacante, atacado))
				resultadoBatalla += "La Pelea " + indicePelea + " no puede realizarse" + "\n";	
		}
		//Muestro un mensaje, de ser necesario
		if (resultadoBatalla!="")
			JOptionPane.showMessageDialog(vista, resultadoBatalla);
	}
	
	/**
	 * Se encarga de generar una pelea
	 * @param atacante Unidad atacante de la pelea
	 * @param atacado Unidad atacada de la pelea
	 * @return True si la pelea fue bien realizada, false en caso contrario
	 */
	private boolean GenerarPelea(Unidad atacante, Atacable atacado){
		try{
			Pelea pelea = jugadorActual.Atacar(atacante, atacado);
			Juego.getInstance().getRonda().getTurnoActual().getBatalla().agregarPelea(pelea);
			return true;
		} catch(ExcepAtaqueInvalido e){
			return false;
		}
		catch(NullPointerException e2){
			return false;
		}
	}
}
